/* Abstract class that provides some basic properties
 * and functions to manage all the objects in a game
 */
#pragma once

#include "IGameManager.h"
#include "IObject.h"
#include "IMovingObject.h"
#include "IWall.h"


#include "SteeringBehaviors.h"

class IObjectManager : public IGameManager
{
	friend class GameEngine;

public:
	virtual void AddPlayerObject(double xpos, double ypos, double zpos)=0;					
	virtual void RemovePlayerObject()=0;
	virtual IMovingObject* GetPlayerObject(int id)=0;
	virtual std::vector<IMovingObject*>* GetPlayerList()=0;

	virtual void AddStationaryObject(double xpos, double ypos, double zpos)=0;
	virtual void RemoveStationaryObject(int id)=0;
	virtual IObject* GetStationaryObject(int id)=0;
	virtual std::vector<IObject*>* GetStationaryList()=0;

	virtual void AddAutonomousObject(double xpos, double ypos, double zpos)=0;
	virtual void RemoveAutonomousObject()=0;
	virtual IMovingObject* GetAutonomousObject(int id)=0;
	virtual std::vector<IMovingObject*>* GetAutonomousList()=0;

    virtual void AddWall(Ogre::Vector3 A, Ogre::Vector3 B, Ogre::Vector3 C, Ogre::Vector3 D)=0;
    virtual void RemoveWall(int id)=0;
    virtual IWall* GetWall(int id)=0;
    virtual std::vector<IWall*>* GetWallList()=0;

	virtual int GetPlayerObjectCount()=0;
	virtual int GetAutonomousObjectCount()=0;
	virtual int GetStationaryObjectCount()=0;
	virtual int GetWallCount()=0;

	virtual bool LineIntersection(Ogre::Vector3 A, Ogre::Vector3 B, Ogre::Vector3 C, 
									Ogre::Vector3 D, double &dist, Ogre::Vector3 &point)=0;
};